package com.luoqiz.file.config;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class HttpUtils {

	/**
	 * 拼接get请求的url请求地址
	 */
	public static String getRqstUrl(String url, Map<String, Object> params) {
		StringBuilder builder = new StringBuilder(url);

		boolean isFirst = true;
		for (String key : params.keySet()) {
			if (key != null && params.get(key) != null) {
				if (isFirst) {
					isFirst = false;

					builder.append("?");
				} else {
					builder.append("&");
				}
				builder.append(key).append("=").append(params.get(key));
			}
		}
		return builder.toString();
	}

	public static String doGet(String url) {

		CloseableHttpClient httpClient = null;
		CloseableHttpResponse response = null;
		String result = "";
		try {
			// 通过址默认配置创建一个httpClient实例
			httpClient = HttpClients.createDefault();
			// 创建httpGet远程连接实例
			HttpGet httpGet = new HttpGet(url);
			// 设置请求头信息，鉴权
			httpGet.setHeader("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
			// 设置配置请求参数
			RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(1000 * 60 * 2)// 连接主机服务超时时间
					.setConnectionRequestTimeout(1000 * 60 * 2)// 请求超时时间
					.setSocketTimeout(1000 * 60 * 2)// 数据读取超时时间
					.build();
			// 为httpGet实例设置配置
			httpGet.setConfig(requestConfig);

			// 执行get请求得到返回对象
			response = httpClient.execute(httpGet);
			// 通过返回对象获取返回数据
			HttpEntity entity = response.getEntity();
			// 通过EntityUtils中的toString方法将结果转换为字符串
			result = EntityUtils.toString(entity);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 关闭资源
			if (null != response) {
				try {
					response.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (null != httpClient) {
				try {
					httpClient.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return result;
	}

	public static String doPost(String url, Map<String, Object> paramMap) {
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse httpResponse = null;
		String result = "";
		// 创建httpClient实例
		httpClient = HttpClients.createDefault();
		// 创建httpPost远程连接实例
		HttpPost httpPost = new HttpPost(url);
		// 配置请求参数实例
		RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(1000 * 60 * 2)// 设置连接主机服务超时时间
				.setConnectionRequestTimeout(1000 * 60 * 2)// 设置连接请求超时时间
				.setSocketTimeout(1000 * 60 * 2)// 设置读取数据连接超时时间
				.build();
		// 为httpPost实例设置配置
		httpPost.setConfig(requestConfig);
		// 设置请求头
		httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
		// 封装post请求参数
		if (null != paramMap && paramMap.size() > 0) {
			List<NameValuePair> nvps = new ArrayList<NameValuePair>();
			// 通过map集成entrySet方法获取entity
			Set<Entry<String, Object>> entrySet = paramMap.entrySet();
			// 循环遍历，获取迭代器
			Iterator<Entry<String, Object>> iterator = entrySet.iterator();
			while (iterator.hasNext()) {
				Entry<String, Object> mapEntry = iterator.next();
				nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString()));
			}

			// 为httpPost设置封装好的请求参数
			try {
				httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		try {
			// httpClient对象执行post请求,并返回响应参数对象
			httpResponse = httpClient.execute(httpPost);
			// 从响应对象中获取响应内容
			HttpEntity entity = httpResponse.getEntity();
			result = EntityUtils.toString(entity);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 关闭资源
			if (null != httpResponse) {
				try {
					httpResponse.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (null != httpClient) {
				try {
					httpClient.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return result;
	}

//	public static HashMap<String, Object> getApiParameters() {
//		Example example = new Example(SmartBusinessApiParameters.class);
//		SmartBusinessApiParametersMapper.class
//		
//			st = conn.createStatement();
//			String sql = "select * from smart_business_api_parameters";
//			 rs = st.executeQuery(sql);
//			while (rs.next()) {
//				map.put("customerId", rs.getString("customer_id"));
//				map.put("token", rs.getString("token"));
//			}

//		return map;

//	}

	public static String getSession(HashMap<String, Object> apiParameters) {

		String session = JSON
				.parseObject(doPost("http://zhsq-api.istarshine.com/zhsq-api/web/loginForAPI.do", apiParameters))
				.getJSONObject("params").getString("session");
		return session;

	}

	/**
	 * 列表页
	 * 
	 * @param customerId
	 * @param session
	 * @param monitorId
	 * @param pageSize
	 * @param pageNum
	 * @param sourceTypes
	 * @return
	 */
	public static JSONObject getBroadData(HashMap<String, Object> params1) {

		String getBroadData = doGet(
				getRqstUrl("http://zhsq-api.istarshine.com/zhsq-api/web/broadData/getBroadData.do", params1));
		JSONObject jsonObjectgetBroadData = JSON.parseObject(getBroadData);

		return jsonObjectgetBroadData;
	}

	public static JSONObject getBroadDataTotal(HashMap<String, Object> params1) {

		String getBroadData = doGet(
				getRqstUrl("http://zhsq-api.istarshine.com/zhsq-api/web/broadData/getBroadDataTotal.do", params1));
		return JSON.parseObject(getBroadData);
	}

	/**
	 * 
	 * 获取天津监控列表
	 * 
	 * @param customerId
	 * @param session
	 * @return
	 */
	public static String getMonitorId(String customerId, String session) {
		LinkedHashMap<String, Object> params = new LinkedHashMap<String, Object>();
		params.put("customerId", customerId);
		params.put("session", session);
		JSONArray jsonArray = JSON
				.parseObject(HttpUtils.doGet(HttpUtils
						.getRqstUrl("http://zhsq-api.istarshine.com/zhsq-api/web/monitor/getMonitorList.do", params)))
				.getJSONArray("params");
		if (jsonArray.size() > 0) {
			for (Iterator<Object> tor = jsonArray.iterator(); tor.hasNext();) {
				JSONObject job = (JSONObject) tor.next();
				if ("卫健委数据".equals(job.get("monitorName"))) {
					return job.getInteger("id") + "";
				}
			}
		}
		return "";
	}

//	public static void main(String[] args) {
//		HashMap<String, Object> apiParameters = getApiParameters();
//		String customerId = apiParameters.get("customerId").toString();
//		String session = getSession(getApiParameters());
//		String monitorId = getMonitorId(customerId, session);
//		System.out.println(monitorId);
//
//	}

}
